package org.programus.nxj.guessnumber.game;

import javax.microedition.lcdui.Graphics;
import javax.microedition.lcdui.Image;

import lejos.nxt.LCD;
import lejos.nxt.Sound;
import lejos.util.Delay;

import org.programus.nxj.guessnumber.utils.BallScanner;
import org.programus.nxj.guessnumber.utils.ColorCombination;
import org.programus.nxj.guessnumber.utils.CompareResult;
import org.programus.nxj.guessnumber.utils.Constants;
import org.programus.nxj.guessnumber.utils.ScoreDisplay;
import org.programus.nxj.util.DisplayUtil;
import org.programus.nxj.util.SoundUtil;
import org.programus.nxj.util.music.Music;
import org.programus.nxj.util.music.SheetParam;

public class GuessGame {
	private BallScanner ballScanner; 
	private ScoreDisplay exactScoreDisplay;
	private ScoreDisplay existScoreDisplay; 
	
	private static final Image EXACT_IMG = new Image(6, 6, new byte[] {
			(byte) 0x1e, (byte) 0x3f, (byte) 0x3f, (byte) 0x3f, (byte) 0x3f,
			(byte) 0x1e, });
	private static final Image EXIST_IMG = new Image(6, 6, new byte[] {
			(byte) 0x1e, (byte) 0x33, (byte) 0x21, (byte) 0x21, (byte) 0x33,
			(byte) 0x1e, });
	private static final Image BLANK_IMG = new Image(6, 6, new byte[] {
			(byte) 0x33, (byte) 0x3f, (byte) 0x1e, (byte) 0x1e, (byte) 0x3f,
			(byte) 0x33, });
	private static final Image WIN_IMG = new Image(100, 64, new byte[] {
			(byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00,
			(byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00,
			(byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00,
			(byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00,
			(byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00,
			(byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00,
			(byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00,
			(byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00,
			(byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00,
			(byte) 0x00, (byte) 0x00, (byte) 0x3c, (byte) 0xc4, (byte) 0x0c,
			(byte) 0x18, (byte) 0xe0, (byte) 0x80, (byte) 0x00, (byte) 0x00,
			(byte) 0x00, (byte) 0xe0, (byte) 0x18, (byte) 0x06, (byte) 0x01,
			(byte) 0xc1, (byte) 0x7e, (byte) 0x00, (byte) 0x00, (byte) 0x00,
			(byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00,
			(byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00,
			(byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00,
			(byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00,
			(byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00,
			(byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00,
			(byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00,
			(byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00,
			(byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00,
			(byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00,
			(byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00,
			(byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00,
			(byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00,
			(byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00,
			(byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00,
			(byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00,
			(byte) 0xf0, (byte) 0xd8, (byte) 0x88, (byte) 0x09, (byte) 0x3f,
			(byte) 0xfc, (byte) 0xa0, (byte) 0xa3, (byte) 0x66, (byte) 0x28,
			(byte) 0x27, (byte) 0x20, (byte) 0x40, (byte) 0xf8, (byte) 0x8f,
			(byte) 0x81, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00,
			(byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00,
			(byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00,
			(byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00,
			(byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00,
			(byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00,
			(byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00,
			(byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00,
			(byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00,
			(byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00,
			(byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00,
			(byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00,
			(byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00,
			(byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00,
			(byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00,
			(byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00,
			(byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00,
			(byte) 0x03, (byte) 0x1e, (byte) 0x31, (byte) 0x43, (byte) 0x46,
			(byte) 0x44, (byte) 0x47, (byte) 0x42, (byte) 0x46, (byte) 0x44,
			(byte) 0x44, (byte) 0x44, (byte) 0x40, (byte) 0x70, (byte) 0x08,
			(byte) 0x07, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00,
			(byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00,
			(byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00,
			(byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00,
			(byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00,
			(byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00,
			(byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00,
			(byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00,
			(byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00,
			(byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00,
			(byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x08, (byte) 0x18,
			(byte) 0x78, (byte) 0xf8, (byte) 0xf0, (byte) 0xc0, (byte) 0xf0,
			(byte) 0xf8, (byte) 0x78, (byte) 0x18, (byte) 0x08, (byte) 0x00,
			(byte) 0x00, (byte) 0x00, (byte) 0x80, (byte) 0x80, (byte) 0x80,
			(byte) 0x80, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00,
			(byte) 0x00, (byte) 0x80, (byte) 0x80, (byte) 0x80, (byte) 0x00,
			(byte) 0x00, (byte) 0x80, (byte) 0x80, (byte) 0x80, (byte) 0x00,
			(byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00,
			(byte) 0x00, (byte) 0xf8, (byte) 0xf8, (byte) 0xf8, (byte) 0x00,
			(byte) 0x00, (byte) 0xf8, (byte) 0xf8, (byte) 0xf8, (byte) 0x00,
			(byte) 0x00, (byte) 0xf8, (byte) 0xf8, (byte) 0xf8, (byte) 0x00,
			(byte) 0x00, (byte) 0xb8, (byte) 0xb8, (byte) 0xb8, (byte) 0x00,
			(byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x80,
			(byte) 0x80, (byte) 0x80, (byte) 0x80, (byte) 0x00, (byte) 0x00,
			(byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0xf8, (byte) 0xf8,
			(byte) 0xf8, (byte) 0xf8, (byte) 0x00, (byte) 0x00, (byte) 0x00,
			(byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00,
			(byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00,
			(byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00,
			(byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00,
			(byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00,
			(byte) 0x00, (byte) 0x00, (byte) 0xff, (byte) 0xff, (byte) 0xff,
			(byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x1e,
			(byte) 0x7f, (byte) 0x7f, (byte) 0xf3, (byte) 0xe3, (byte) 0xe3,
			(byte) 0xe3, (byte) 0x7f, (byte) 0x7f, (byte) 0x1e, (byte) 0x00,
			(byte) 0x00, (byte) 0x3f, (byte) 0x7f, (byte) 0xff, (byte) 0xe0,
			(byte) 0xe0, (byte) 0xff, (byte) 0x7f, (byte) 0x3f, (byte) 0x00,
			(byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00,
			(byte) 0x00, (byte) 0x3f, (byte) 0xff, (byte) 0xff, (byte) 0xe0,
			(byte) 0xe0, (byte) 0x7f, (byte) 0x7f, (byte) 0xff, (byte) 0xe0,
			(byte) 0xe0, (byte) 0xff, (byte) 0x7f, (byte) 0x3f, (byte) 0x00,
			(byte) 0x00, (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0x00,
			(byte) 0x00, (byte) 0x00, (byte) 0xfe, (byte) 0xff, (byte) 0xff,
			(byte) 0x03, (byte) 0x03, (byte) 0xff, (byte) 0xff, (byte) 0xfe,
			(byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x63, (byte) 0xf7,
			(byte) 0xf7, (byte) 0xf7, (byte) 0x60, (byte) 0x00, (byte) 0x00,
			(byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00,
			(byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00,
			(byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00,
			(byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00,
			(byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00,
			(byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00,
			(byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00,
			(byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00,
			(byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00,
			(byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00,
			(byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00,
			(byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00,
			(byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00,
			(byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00,
			(byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00,
			(byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00,
			(byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00,
			(byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00,
			(byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00,
			(byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00,
			(byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00,
			(byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00,
			(byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00,
			(byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00,
			(byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00,
			(byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00,
			(byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00,
			(byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00,
			(byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00,
			(byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00,
			(byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00,
			(byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00,
			(byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00,
			(byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00,
			(byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00,
			(byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00,
			(byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00,
			(byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00,
			(byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00,
			(byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00,
			(byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00,
			(byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00,
			(byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00,
			(byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00,
			(byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00,
			(byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00,
			(byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00,
			(byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00,
			(byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00,
			(byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00,
			(byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00,
			(byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00,
			(byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00,
			(byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00,
			(byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00,
			(byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00,
			(byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00,
			(byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00,
			(byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00,
			(byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00,
			(byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00,
			(byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, });
	private static final Image START_IMG = new Image(100, 64, new byte[] {
			(byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00,
			(byte) 0x00, (byte) 0x3e, (byte) 0x0a, (byte) 0x0e, (byte) 0x00,
			(byte) 0x3e, (byte) 0x20, (byte) 0x20, (byte) 0x00, (byte) 0x3e,
			(byte) 0x2a, (byte) 0x2a, (byte) 0x00, (byte) 0x3c, (byte) 0x0a,
			(byte) 0x3c, (byte) 0x00, (byte) 0x24, (byte) 0x2a, (byte) 0x12,
			(byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00,
			(byte) 0x22, (byte) 0x3e, (byte) 0x22, (byte) 0x00, (byte) 0x3e,
			(byte) 0x02, (byte) 0x3e, (byte) 0x00, (byte) 0x24, (byte) 0x2a,
			(byte) 0x12, (byte) 0x00, (byte) 0x3e, (byte) 0x2a, (byte) 0x2a,
			(byte) 0x00, (byte) 0x3e, (byte) 0x1a, (byte) 0x2e, (byte) 0x00,
			(byte) 0x02, (byte) 0x3e, (byte) 0x02, (byte) 0x00, (byte) 0x00,
			(byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x02, (byte) 0x3e,
			(byte) 0x02, (byte) 0x00, (byte) 0x3e, (byte) 0x08, (byte) 0x3e,
			(byte) 0x00, (byte) 0x3e, (byte) 0x2a, (byte) 0x2a, (byte) 0x00,
			(byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x3e,
			(byte) 0x0a, (byte) 0x0e, (byte) 0x00, (byte) 0x3c, (byte) 0x0a,
			(byte) 0x3c, (byte) 0x00, (byte) 0x3e, (byte) 0x02, (byte) 0x3e,
			(byte) 0x00, (byte) 0x3e, (byte) 0x2a, (byte) 0x2a, (byte) 0x00,
			(byte) 0x3e, (byte) 0x20, (byte) 0x20, (byte) 0x00, (byte) 0x00,
			(byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00,
			(byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00,
			(byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00,
			(byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00,
			(byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00,
			(byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00,
			(byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00,
			(byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00,
			(byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00,
			(byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00,
			(byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00,
			(byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00,
			(byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00,
			(byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00,
			(byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00,
			(byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00,
			(byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00,
			(byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00,
			(byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00,
			(byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00,
			(byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00,
			(byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00,
			(byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00,
			(byte) 0x00, (byte) 0x00, (byte) 0x80, (byte) 0xc0, (byte) 0xc0,
			(byte) 0xe0, (byte) 0xe0, (byte) 0xe0, (byte) 0xc0, (byte) 0xc0,
			(byte) 0x80, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00,
			(byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00,
			(byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00,
			(byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00,
			(byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00,
			(byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00,
			(byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00,
			(byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00,
			(byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00,
			(byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00,
			(byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00,
			(byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00,
			(byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00,
			(byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00,
			(byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00,
			(byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00,
			(byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00,
			(byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00,
			(byte) 0x00, (byte) 0x0e, (byte) 0x3f, (byte) 0x79, (byte) 0x7e,
			(byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0x7f, (byte) 0x7f,
			(byte) 0x3f, (byte) 0x0e, (byte) 0x00, (byte) 0x80, (byte) 0x60,
			(byte) 0x20, (byte) 0x90, (byte) 0xd0, (byte) 0x20, (byte) 0x60,
			(byte) 0x80, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00,
			(byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00,
			(byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00,
			(byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00,
			(byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00,
			(byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00,
			(byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x80,
			(byte) 0x80, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00,
			(byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00,
			(byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00,
			(byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00,
			(byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00,
			(byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00,
			(byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00,
			(byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00,
			(byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0xc0, (byte) 0x40,
			(byte) 0x40, (byte) 0x40, (byte) 0x40, (byte) 0x40, (byte) 0x40,
			(byte) 0x40, (byte) 0xfe, (byte) 0x40, (byte) 0x40, (byte) 0x40,
			(byte) 0x40, (byte) 0xc0, (byte) 0x40, (byte) 0x41, (byte) 0x46,
			(byte) 0x44, (byte) 0x48, (byte) 0x4b, (byte) 0x44, (byte) 0x46,
			(byte) 0x41, (byte) 0x40, (byte) 0x40, (byte) 0x40, (byte) 0xc0,
			(byte) 0x40, (byte) 0x40, (byte) 0x40, (byte) 0x40, (byte) 0x40,
			(byte) 0x40, (byte) 0x40, (byte) 0x40, (byte) 0x40, (byte) 0x40,
			(byte) 0x40, (byte) 0x40, (byte) 0xc0, (byte) 0x40, (byte) 0x40,
			(byte) 0x40, (byte) 0x40, (byte) 0x40, (byte) 0x40, (byte) 0x40,
			(byte) 0x40, (byte) 0x40, (byte) 0x40, (byte) 0x40, (byte) 0x40,
			(byte) 0xc0, (byte) 0x0c, (byte) 0x33, (byte) 0x21, (byte) 0x5a,
			(byte) 0x56, (byte) 0x21, (byte) 0x33, (byte) 0x0c, (byte) 0x00,
			(byte) 0xfe, (byte) 0x02, (byte) 0x02, (byte) 0x02, (byte) 0x02,
			(byte) 0x02, (byte) 0x02, (byte) 0x02, (byte) 0x02, (byte) 0x02,
			(byte) 0x02, (byte) 0x02, (byte) 0x02, (byte) 0x02, (byte) 0x42,
			(byte) 0x42, (byte) 0x82, (byte) 0x82, (byte) 0x02, (byte) 0x02,
			(byte) 0x02, (byte) 0x02, (byte) 0x02, (byte) 0x02, (byte) 0x02,
			(byte) 0x02, (byte) 0x02, (byte) 0x02, (byte) 0x02, (byte) 0x02,
			(byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00,
			(byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0xff, (byte) 0x03,
			(byte) 0x0c, (byte) 0x30, (byte) 0xc0, (byte) 0x80, (byte) 0x83,
			(byte) 0x8c, (byte) 0xbf, (byte) 0x8c, (byte) 0x83, (byte) 0x80,
			(byte) 0x80, (byte) 0xff, (byte) 0x83, (byte) 0x8c, (byte) 0xb0,
			(byte) 0xc0, (byte) 0x80, (byte) 0x80, (byte) 0x80, (byte) 0x80,
			(byte) 0x80, (byte) 0x80, (byte) 0x80, (byte) 0x80, (byte) 0xff,
			(byte) 0x83, (byte) 0x8c, (byte) 0xb0, (byte) 0xc0, (byte) 0x80,
			(byte) 0x80, (byte) 0x80, (byte) 0x80, (byte) 0x80, (byte) 0x80,
			(byte) 0x80, (byte) 0x80, (byte) 0xff, (byte) 0x83, (byte) 0x8c,
			(byte) 0xb0, (byte) 0xc0, (byte) 0x80, (byte) 0x80, (byte) 0x80,
			(byte) 0x80, (byte) 0x81, (byte) 0x81, (byte) 0x81, (byte) 0x81,
			(byte) 0xff, (byte) 0x83, (byte) 0x8d, (byte) 0xb1, (byte) 0xc1,
			(byte) 0x01, (byte) 0x01, (byte) 0x01, (byte) 0x01, (byte) 0x01,
			(byte) 0xff, (byte) 0xc1, (byte) 0x41, (byte) 0x41, (byte) 0x41,
			(byte) 0x41, (byte) 0xf1, (byte) 0x11, (byte) 0x11, (byte) 0x11,
			(byte) 0x11, (byte) 0x11, (byte) 0x11, (byte) 0x11, (byte) 0x15,
			(byte) 0x15, (byte) 0x13, (byte) 0x13, (byte) 0x11, (byte) 0x11,
			(byte) 0x10, (byte) 0x10, (byte) 0x10, (byte) 0x10, (byte) 0x10,
			(byte) 0x10, (byte) 0x10, (byte) 0x10, (byte) 0x10, (byte) 0x10,
			(byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00,
			(byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x01, (byte) 0x06,
			(byte) 0x18, (byte) 0x60, (byte) 0xff, (byte) 0x00, (byte) 0x00,
			(byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00,
			(byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00,
			(byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00,
			(byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00,
			(byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00,
			(byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00,
			(byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00,
			(byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00,
			(byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00,
			(byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0xff,
			(byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00,
			(byte) 0x01, (byte) 0x06, (byte) 0x1b, (byte) 0x6c, (byte) 0xb0,
			(byte) 0xc0, (byte) 0xff, (byte) 0x00, (byte) 0x00, (byte) 0x00,
			(byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00,
			(byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00,
			(byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00,
			(byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00,
			(byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00,
			(byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00,
			(byte) 0x00, (byte) 0x00, (byte) 0x01, (byte) 0x01, (byte) 0x01,
			(byte) 0x01, (byte) 0x01, (byte) 0x01, (byte) 0x01, (byte) 0x01,
			(byte) 0x01, (byte) 0x01, (byte) 0x01, (byte) 0x01, (byte) 0x01,
			(byte) 0x01, (byte) 0x01, (byte) 0x01, (byte) 0x01, (byte) 0x01,
			(byte) 0x01, (byte) 0x01, (byte) 0x01, (byte) 0x01, (byte) 0x01,
			(byte) 0x01, (byte) 0x01, (byte) 0x01, (byte) 0x01, (byte) 0x01,
			(byte) 0x01, (byte) 0x01, (byte) 0x01, (byte) 0x01, (byte) 0x01,
			(byte) 0x01, (byte) 0x01, (byte) 0x01, (byte) 0x01, (byte) 0x01,
			(byte) 0x01, (byte) 0x01, (byte) 0x01, (byte) 0x01, (byte) 0x01,
			(byte) 0x01, (byte) 0x01, (byte) 0x01, (byte) 0x01, (byte) 0x01,
			(byte) 0x01, (byte) 0x01, (byte) 0x01, (byte) 0x01, (byte) 0x01,
			(byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00,
			(byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x01,
			(byte) 0x06, (byte) 0x1f, (byte) 0x10, (byte) 0x10, (byte) 0x10,
			(byte) 0x10, (byte) 0x10, (byte) 0x10, (byte) 0x10, (byte) 0x10,
			(byte) 0x10, (byte) 0x10, (byte) 0x10, (byte) 0x10, (byte) 0x10,
			(byte) 0x10, (byte) 0x10, (byte) 0x10, (byte) 0x10, (byte) 0x10,
			(byte) 0x10, (byte) 0x10, (byte) 0x10, (byte) 0x10, (byte) 0x10, });
	
	public GuessGame() {
		ballScanner = new BallScanner(); 
		ballScanner.init(); 
		exactScoreDisplay = new ScoreDisplay(true); 
		existScoreDisplay = new ScoreDisplay(false); 
	}
	
	public boolean playOneGame() {
		LCD.clear(); 
		this.drawStart(); 
		LCD.refresh(); 
		ColorCombination answer = ColorCombination.getRandomCombination(Constants.COLOR_LIMIT, true); 
		ballScanner.startScanThread(); 
		ballScanner.waitStart(); 
		LCD.clear(); 
		LCD.refresh(); 
		boolean ret = false;
		for (int i = 0; i < Constants.CHANGES; i++) {
			ColorCombination guess = ballScanner.getColorCombination(); 
			CompareResult result = guess.compareTo(answer); 
			if (result.exactCorrect == Constants.BALL_NUM) {
				exactScoreDisplay.congratulationWin(); 
				existScoreDisplay.congratulationWin(); 
				this.playWinSound(); 
				LCD.clear();
				this.drawWin(i); 
				ret = true;
				break;
			} else {
				result.displayScore(exactScoreDisplay, existScoreDisplay); 
				this.playTurnSound(i); 
				this.drawGuess(guess, i); 
				this.drawResult(result, i); 
			}
			LCD.refresh();
		}
		if (!ret) {
			exactScoreDisplay.reset(); 
			existScoreDisplay.reset(); 
			this.playLoseSound();
			this.drawLose(answer); 
		}
		ballScanner.stopScanThread(); 
		return ret;
	}
	
	private void drawGuess(ColorCombination guess, int chance) {
		LCD.drawString(guess.toLcdString(), 0, chance); 
	}
	
	private void drawResult(CompareResult result, int chance) {
		final int RIGHT_GAP = 2;
		int w = 0; 
		int n = Constants.BALL_NUM - result.exactCorrect - result.existCorrect; 
		for (int i = 0; i < n; i++) {
			DisplayUtil.drawImageRight(BLANK_IMG, chance << 3, RIGHT_GAP + w, LCD.ROP_COPY); 
			w += BLANK_IMG.getWidth(); 
		}
		for (int i = 0; i < result.existCorrect; i++) {
			DisplayUtil.drawImageRight(EXIST_IMG, chance << 3, RIGHT_GAP + w, LCD.ROP_COPY); 
			w += EXIST_IMG.getWidth(); 
		}
		for (int i = 0; i < result.exactCorrect; i++) {
			DisplayUtil.drawImageRight(EXACT_IMG, chance << 3, RIGHT_GAP + w, LCD.ROP_COPY); 
			w += EXACT_IMG.getWidth();
		}
	}
	
	private void drawWin(int chance) {
		DisplayUtil.drawImageCenter(WIN_IMG, 0, LCD.ROP_COPY); 
		String msg = "in " + chance + " steps"; 
		DisplayUtil.drawStringCenter(msg, 7); 
	}
	
	private void drawLose(ColorCombination answer) {
		// draw over animation
		Graphics g = new Graphics(); 
		final int LIMIT = (g.getHeight() >> 1) + 1; 

		for (int topLine = 0; topLine < LIMIT; topLine++) {
			g.fillRect(0, 0, g.getWidth(), topLine); 
			g.fillRect(0, g.getHeight() - topLine - 1, g.getWidth(), topLine + 1); 
			g.refresh(); 
			Delay.msDelay(30); 
		}
		DisplayUtil.drawStringCenter("Sorry, you lose.", 3 * LCD.CELL_HEIGHT, true); 
		DisplayUtil.drawStringCenter("The answer is:", 4 * LCD.CELL_HEIGHT, true); 
		DisplayUtil.drawStringCenter(answer.toLcdString(), 5 * LCD.CELL_HEIGHT, true); 
		g.refresh(); 
	}
	
	private void playTurnSound(final int chance) {
		new Thread(new Runnable() {
			@Override
			public void run() {
				int duration = 300; 
				SoundUtil.playNote(5 + chance / 7, chance % 7 + 1, false, duration, true); 
			}
		}).start(); 
	}
	
	private void playWinSound() {
		new Thread(new Runnable() {
			@Override
			public void run() {
				int duration = 100; 
				SoundUtil.playNote(5, 1, false, duration, true); 
				SoundUtil.playNote(5, 2, false, duration, true); 
				SoundUtil.playNote(5, 3, false, duration, true); 
				duration = 200; 
				SoundUtil.playNote(5, 5, false, duration, true); 
				duration = 100; 
				SoundUtil.playNote(5, 3, false, duration, true); 
				duration = 500; 
				SoundUtil.playNote(5, 5, false, duration, true); 
			}
		}).start(); 
	}
	
	private void playLoseSound() {
		new Thread(new Runnable() {
			@Override
			public void run() {
				new Music(new SheetParam(SheetParam.FAST_BEAT_DUR, 0, new int[]{20, 0, 10, 0}, false), new String[] {
					"6b/16 6a#/16 6a/16 6g#16 6g/16 6f#/16 6f/16 6e/16 6d#/16 6d/16 6c#/16 6c/16", 
					"5b/16 5a#/16 5a/16 5g#16 5g/16 5f#/16 ", 
					"4g/2", 
				}).play(Sound.PIANO); 
			}
		}).start(); 
	}
	
	private void drawStart() {
		DisplayUtil.drawImageCenter(START_IMG, 0, LCD.ROP_COPY); 
	}
}
